package com.kotlin.flong.coroutines

import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis

/**
 * @Author:liangjl
 * @Date: 2020/7/7-19:51
 * @Eamil:jilongliang@sina.com
 * @Description:
 *  使用async和wait实现并发
 *  1、从概念上说，async就像launch一样，它会开启一个单独的协程，这个协程是一个轻量级的线程，可以与其他协程并发工作，区别在于，launch会返回一个
 *  Job，但是Job并不会持有任何结果值，而async会返回一个Deferred,这是一个轻量级的非阻塞future,它代表一个promise可以，在稍后提供一个结果值
 *
 *  2、可以通过一个Deferred值上调用.wait()方法来获取最终的结果值，Deferred也是一个Job，因此可以需要时对其他进行取消
 */

fun main() = runBlocking {

    var measure = measureTimeMillis {
        var value1 = async { intValue1() }
        var value2 = async { intValue2() }
        var result1 = value1.await()
        var result2 = value2.await()

        println("$result1+$result2=${result1 + result2}")
    }

    println("总耗时：$measure")

}

private suspend fun intValue1(): Int {
    delay(2000)
    return 15
}

private suspend fun intValue2(): Int {
    delay(3000)
    return 20
}